﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SouthApps.MobileHealth.SDK.DAL.DataAccess;
using SouthApps.MobileHealth.SDK.Common.Exceptions;
using SouthApps.MobileHealth.SDK.DAL.Model;
using SouthApps.MobileHealth.SDK.Common;

namespace SouthApps.MobileTasks.SDK.DAL.Repositories
{
    public class FinanciadoresRepository : IFinanciadoresRepository
    {
        FinanciadorDao financiadorDao;
        ServicioEspecialDao servicioEspecialDao;
        ServicioGuardiaDao servicioGuardiaDao;
        CentroAtencionDao centroAtencionDao;

        public FinanciadoresRepository()
        {
            this.financiadorDao = new FinanciadorDao();
            this.servicioEspecialDao = new ServicioEspecialDao();
            this.servicioGuardiaDao = new ServicioGuardiaDao();
            this.centroAtencionDao = new CentroAtencionDao();
        }


        public void AddFinanciador(Financiador financiador)
        {
            try
            {
                this.financiadorDao.AddFinanciador(financiador);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while adding a financiador.", ex.Message);
            }
        }

        public List<Financiador> GetFinanciadores()
        {
            try
            {
                return this.financiadorDao.GetFinanciadores();
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting financiadores.", ex.Message);
            }
        }

        public void ModifyFinanciador(Financiador financiador)
        {
            try
            {
                this.financiadorDao.ModifyFinanciador(financiador);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while modifying a financiador.", ex.Message);
            }
        }


        public Financiador GetFinanciador(int financiadorId)
        {
            try
            {
                return this.financiadorDao.GetFinanciador(financiadorId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting financiador.", ex.Message);
            }
        }

        public List<ServicioEspecial> GetServiciosEspeciales()
        {
            try
            {
                return this.servicioEspecialDao.GetServiciosEspeciales();
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting servicios especiales financiador.", ex.Message);
            }
        }

        public List<ServicioEspecial> GetServiciosEspecialesLocaciones(int financiadorId)
        {
            try
            {
                return this.servicioEspecialDao.GetServiciosEspecialesConLocacionesServiciosEspeciales(financiadorId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting servicios especiales locaciones.", ex.Message);
            }
        }

        public List<ServicioGuardia> GetServiciosGuardiaFinanciador(int financiadorId)
        {
            try
            {
                return this.servicioGuardiaDao.GetServiciosGuardiaFinanciador(financiadorId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting servicios guardia financiador.", ex.Message);
            }
        }


        public void AddCentroAtencion(int financiadorId, CentroAtencion centroAtencion)
        {
            try
            {
                this.centroAtencionDao.AddCentroAtencion(centroAtencion);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while adding a centro atencion.", ex.Message);
            }
        }

        public List<CentroAtencion> GetCentrosAtencionFinanciador(int financiadorId)
        {
            try
            {
                return this.centroAtencionDao.GetCentrosAtencionFinanciador(financiadorId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting centros de atencion financiador.", ex.Message);
            }
        }

        public void ModifyCentroAtencion(CentroAtencion centroAtencion)
        {
            try
            {
                this.centroAtencionDao.ModifyCentroAtencion(centroAtencion);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while modifying a centro atencion.", ex.Message);
            }
        }
    }
}
